package pattern7.threadPool.demo;

import utils.PrintUtil;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @创建人 liweijia
 * @创建时间 2022/7/31
 * @描述 程序的主要用途
 */
public class MyThreadPool {

    /**
     * 任务队列
     */
    private final Queue<Runnable> taskQueue;

    /**
     * 工作线程列表
     */
    private final List<WorkThread> workThreadList;

    /**
     * 任务队列大小
     */
    private Integer queueSize;

    public MyThreadPool(Integer queueSize, Integer coreThreadNum) {
        this.taskQueue = new LinkedList<>();
        this.queueSize = queueSize;
        this.workThreadList = new ArrayList<>();
        // 初始化n个工作线程
        for (int i = 0; i < coreThreadNum; i++) {
            workThreadList.add(new WorkThread(this.taskQueue));
        }
        // 启动线程
        for (WorkThread thread : workThreadList) {
            thread.start();
        }
    }

    /**
     * 提交任务
     *
     * @param task
     */
    public void submit(Runnable task) {
        synchronized (taskQueue) {
            PrintUtil.print(String.format("线程池任务队列大小[%d]", taskQueue.size()));
            // 拒绝
            if (taskQueue.size() == queueSize) {
                PrintUtil.print(String.format("线程池[%d]满了，拒绝任务", taskQueue.size()));
                return;
            }
            taskQueue.offer(task);
            taskQueue.notifyAll();
        }
    }
}
